﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Prototipo.control;
using SIGEB.Modelo.moduloComputadoras;
using System.DirectoryServices.AccountManagement;
using System.Diagnostics;

namespace SIGEB.Prototipo.Control
{
    public class controlInfoComputadoras
    {
        #region "constructores"

        public controlInfoComputadoras(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "métodos"

        internal void crearInfoComputadora(string username, string password)
        {
            cp.datos.infocomputadoras.agregarInfoComputadora(new infoComputadora(null, username, password));
        }

        internal void modificarInfoComputadora(infoComputadora editando)
        {
            cp.datos.infocomputadoras.modificarInfoComputadora(editando.idInfoComp, editando);
        }

        internal void eliminarInfoComputadora(infoComputadora eliminando)
        {
            cp.datos.infocomputadoras.eliminarInfoComputadora(eliminando.idInfoComp);
        }

        internal LinkedList<infoComputadora> obtenerInfoComputadoras()
        {
            return cp.datos.infocomputadoras.obtenerInfoComputadoras();
        }

        internal infoComputadora infoComputadora(string ip)
        {
            LinkedList<infoComputadora> compus = obtenerInfoComputadoras();
            if (compus != null && compus.Count > 0)
            {
                foreach (infoComputadora act in compus)
                {
                    if (permisosComputadoraValidos(act.username, act.desencriptar_password(), ip))
                    {
                        return act;
                    }
                }
            }
            return null;
        }

         internal bool permisosComputadoraValidos(string usuario, string pass, string machineName)
        {
            /*try
            {
                Process p = new Process();
                p.StartInfo.Arguments = "use \\\\" + machineName + "\\c$ /user:" + usuario + " " + pass;
                p.StartInfo.FileName = "net.exe";
                p.StartInfo.UseShellExecute = false;
                p.Start();
                p.WaitForExit();

                int resultado = p.ExitCode;
                return resultado == 0;
            }
            catch
            {
                return false;
            }*/

            try
            {
                using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
                {
                    return context.ValidateCredentials(usuario, pass, ContextOptions.Negotiate);
                }
            }
            catch
            {
                return false;
            }
        }

        internal void apagarComputadora(string usuario, string pass, string machineName)
        {
            //Process p = new Process();
            //p.StartInfo.Arguments = "\\\\" + machineName + " -u " + usuario + " -p " + pass + " shutdown -s -f -t 10";
            //p.StartInfo.FileName = "psexec.exe";
            //p.StartInfo.UseShellExecute = false;
            //p.Start();

            Process p = new Process();
            p.StartInfo.Arguments = "-m \\\\" + machineName + " /s /f /t 10";
            p.StartInfo.FileName = "shutdown.exe";
            p.StartInfo.UseShellExecute = false;
            p.Start();
        }

        #endregion

        #region "atributos"

        controlPrincipal cp;

        #endregion
    }
}
